package com.iaz.tech.tools.common.utils;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;



public class StringUtil {

    /** 
     * 日志
     */
	private final static Logger logger = (Logger) LoggerFactory.getLogger(StringUtil.class);

    public static boolean isBlank(String str) {
        return StringUtils.isBlank(str);
    }
    /**
     * 判断字符串是否不为空
     * @param str
     * @return
     */
    public static boolean isNotBlank(String str) {
        return StringUtils.isNotBlank(str);
    }
    /**
     * 判断字符串是否为空
     * @param str
     * @return
     */
    public static boolean isEmpty(String str) {
        return StringUtils.isEmpty(str);
    }
    /**
     * 判断字符串是否不为空
     * @param str
     * @return
     */
    public static boolean isNotEmpty(String str) {
        return StringUtils.isNotEmpty(str);
    }
    /**
     * 字符串分词
     * @param content
     * @return
     * @throws Exception
     */ 
    public static List<String> splitStr(String content) {
        List<String> result = new ArrayList<String>();
        try {
            if (isBlank(content)) {
                logger.warn("splitStr content is blank");
                return result;
            }

            String tmp_str = UtilTools.Trim(content);
            /* 支持+, * , - , /, "", ++, -= , +=, -= , *= 。 /= */
            String word = "";

            for(int i = 0; i < tmp_str.length(); i++) {
                String char_tmp = tmp_str.substring(i, i+1);
                if(char_tmp.equals(" ")) {
                    if (!UtilTools.IsNull(word)){
                        result.add(word);
                    }
                    word = "";
                } else if (StringUtil.isMathSymbol(char_tmp)){
                    if (!UtilTools.IsNull(word) &&
                        !StringUtil.isMathSymbol(word)){
                        result.add(word);
                        word = char_tmp;
                    } else if(StringUtil.isMathSymbol(word)){
                        if (StringUtil.isMathSymbol(word + char_tmp )) {
                            word += char_tmp;
                        } else {
                            result.add(word);
                            word = char_tmp;
                        }                        
                    } else {
                        word = char_tmp;
                    }
                } else if (!StringUtil.isMathSymbol(char_tmp)) {
                    if (!UtilTools.IsNull(word) &&
                     StringUtil.isMathSymbol(word)){
                        if (word.equals("-")  ) {
                            if (result.isEmpty()){
                                word += char_tmp;
                            } else if (StringUtil.isMathSymbol(result.get(result.size() - 1))
                                      && (!result.get(result.size() - 1).equals(")") )
                            ) {
                                word += char_tmp;    
                            } else {
                                result.add(word);
                                word = char_tmp;
                            }
                        } else if (word.equals("--")) {
                            result.add("-");
                            word = "-" + char_tmp;
                        } else {
                            result.add(word);
                            word = char_tmp;
                        }
                    } else {
                        word += char_tmp;                    
                    }
                } else {
                    word += char_tmp;                    
                }
            }
            if (!UtilTools.IsNull(word)){
                result.add(word);
            }
        } catch (Exception e) {
            logger.error("splitStr error", e);
        }
        return result;
    }
    /**
     * 判断字符串是否为数学符号
     */
    public static boolean isMathSymbol(String str) {
        if (isMathSymbol01(str)) {
            return true;
        } else if (isMathSymbol02(str)) {
            return true;
        } else if (isMathSymbol03(str)) {
            return true;
        } else if (isMathSymbol0301(str)) {
            return true;
        } else if (isMathSymbol04(str)) {
            return true;
        } else if (isMathSymbol06(str)) {
            return true;
        } else if (isMathSymbol07(str)) {
            return true;
        } else if (isMathSymbol08(str)) {
            return true;
        } else if (isMathSymbol09(str)) {
            return true;
        }
        return false;
    }
    /**
     * 数学验证符
     * @param str
     * @return
     */
    public static boolean isMathSymbol01(String str) {
        return str.matches("(\\*|-{1,2}|\\+{1,2}|/|=|%|\\^)");
    }

    public static boolean isMathSymbol02(String str) {
        return str.matches("(\\*=|-=|\\+=|/=|%=|\\^=)");
    }

    public static boolean isMathSymbol03(String str) {
        return str.matches("(\\||&|!)");
    }

    public static boolean isMathSymbol0301(String str) {
        return str.matches("(\\|=|&=)");
    }

    public static boolean isMathSymbol04(String str) {
        return str.matches("(\\|\\||&&|!=|==)");
    }

    public static boolean isMathSymbol06(String str) {
        return str.matches("(<<|>>|>>=|<<=)");
    }

    public static boolean isMathSymbol07(String str) {
        return str.matches("(>|<|>=|<=)");
    }

    public static boolean isMathSymbol08(String str) {
        return str.matches("(\\(|\\))");
    }

    public static boolean isMathSymbol09(String str) {
        return str.matches("(\\(\\)|\\[|\\]|\\[\\]|\\{|\\}|\\{\\})");
    }
    
}
